package com.hsnn.medstgmini.pro.project.controller;

import java.lang.reflect.Type;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.hsnn.medstgmini.Constants;
import com.hsnn.medstgmini.base.std.model.StdCompinfo;
import com.hsnn.medstgmini.base.std.model.form.StdProdDrugInfoForm;
import com.hsnn.medstgmini.base.std.service.StdProdDrugInfoManager;
import com.hsnn.medstgmini.pro.project.model.BidProjectDetails;
import com.hsnn.medstgmini.pro.project.model.form.ProdProjectForm;
import com.hsnn.medstgmini.pro.project.service.ProdDrugManager;
import com.hsnn.medstgmini.pro.project.service.ProdProfileManager;
import com.hsnn.medstgmini.sys.model.SysUser;
import com.hsnn.medstgmini.util.Pagination;
import com.hsnn.medstgmini.util.ParseDate;

/**
 * @category 生产企业药品申报管理
 * @author 蔡春龙
 * @date 2015年8月28日
 */
@Controller
@RequestMapping("/prodDrug")
public class ProdDrugController {

	private static final Logger log = Logger
			.getLogger(ProdDrugController.class);

	@Autowired
	private ProdDrugManager prodDrugManager;
	
	@Autowired
	private ProdProfileManager prodProfileManager;
	
	@Autowired
	private StdProdDrugInfoManager stdProdDrugInfoManager;

	@Autowired
	private HttpServletRequest request;

	@Autowired
	private HttpSession session;

	/**
	 * @category 获取当前登陆人信息
	 * @author 言科
	 * @date 2015年7月22日 SysUser
	 */
	public SysUser getUser() {
		return (SysUser) session.getAttribute(Constants.USERINFO);
	}

	/**
	 * @category 跳转生产企业药品申报管理页面（展示已报名的项目列表）
	 * @date 2015年8月28日
	 * @return
	 */
	@RequestMapping("/toDrugProjectList")
	public String toDrugProjectList() {
		log.info("enter toDrugProjectList method!");
		return "/pro/project/prod/drugProjectList";
	}

	/**
	 * @category 跳转某项目下药品申报列表页面
	 * @date 2015年8月28日
	 * @param model
	 * @param projId
	 * @return
	 */
	@RequestMapping("/toProdDrugList")
	public String toProdDrugList(Model model, String projId) {
		log.info("enter toProdDrugList method!");
		model.addAttribute("projId", projId);
		return "/pro/project/prod/prodDrugList";
	}

	/**
	 * @category 查询生产企业产品库
	 * @date 2015年8月28日
	 * @param form
	 * @return
	 */
	@RequestMapping("/getProdDrugList")
	@ResponseBody
	public Pagination getProdDrugList(StdProdDrugInfoForm form) {
		Pagination page = new Pagination(request);
		try {
			SysUser user = getUser();
			StdCompinfo compInfo = user.getInfo();
			if (compInfo != null) {
				String compId = compInfo.getCompId();
				if (StringUtils.isNotBlank(compId)) {
					form.setProdCompId(compId);
					page.setForm(form);
					prodDrugManager.getProdDrugList(page);
					if(StringUtils.isNotBlank(user.getDefaultProjId())){
						BidProjectDetails bidProjectDetails =prodProfileManager.getBidProjectDetailsById(user.getDefaultProjId());
						if(bidProjectDetails.getProSubmitEndtime()!=null && bidProjectDetails.getProjStarttime()!=null && bidProjectDetails.getProSubmitEndtime().getTime()>=new Date().getTime() ){
							page.setForm(Constants.DEFAULT_PROJ_1);//默认项目并且该项目在申报时间段内
						}else{
							page.setForm(Constants.DEFAULT_PROJ_2);//默认项目并且该项目不在申报时间段内
						}
					}else{
						page.setForm(Constants.DEFAULT_PROJ_3);//全部项目，为分离项目
					}
					page.setSuccess(true);
				}
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 生产企业跳转产品新增编辑页面
	 * @date 2015年8月30日
	 * @param model
	 * @param projId
	 * @return
	 */
	@RequestMapping("/toProdDrugEdit")
	public String toProdDrugEdit(Model model, String projId) {
		log.info("enter toProdDrugEdit method!");
		model.addAttribute("projId", projId);
		return "/pro/project/prod/prodDrugEdit";
	}

	/**
	 * @category 生产企业保存新增编辑的产品
	 * @date 2015年8月30日
	 * @param form
	 * @return
	 */
	@RequestMapping("/saveProdDrug")
	@ResponseBody
	public Pagination saveProdDrug(StdProdDrugInfoForm form) {
		Pagination page = new Pagination(request);
		try {
			if (form != null) {
				StdCompinfo compInfo = getUser().getInfo();
				if (compInfo != null) {
					String compId = compInfo.getCompId();
					if (StringUtils.isNotBlank(compId)) {
						form.setProdCompId(compId);
					}
				}
				stdProdDrugInfoManager.saveProdDrugInfo(form, getUser());
				page.setSuccess(true);
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * 
	 * @category 提交申报药品
	 * @date 2015年8月30日
	 * @param array
	 * @return
	 */
	@RequestMapping("/submitProdDrugList")
	@ResponseBody
	public Pagination submitProdDrugList(String array) {
		Pagination page = new Pagination(request);
		try {
			if (StringUtils.isNotBlank(array)) {
				Gson gson = new Gson();
				Type type = new TypeToken<List<StdProdDrugInfoForm>>() {
				}.getType();
				List<StdProdDrugInfoForm> list = gson.fromJson(array, type);
				prodDrugManager.submitProdDrugList(list, getUser());
				page.setSuccess(true);
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 生产企业跳转早报药品审核结果列表页面
	 * @date 2015年8月30日
	 * @param model
	 * @param projId
	 * @return
	 */
	@RequestMapping("/toDrugAuditResultList")
	public String toDrugAuditResultList(Model model, String projId) {
		log.info("enter toDrugAuditResultList method!");
		model.addAttribute("projId", projId);
		return "/pro/project/prod/drugAuditResultList";
	}

	/**
	 * @category 查询企业申报药品审核结果列表
	 * @date 2015年8月30日
	 * @param form
	 * @return
	 */
	@RequestMapping("/getDrugAuditResultList")
	@ResponseBody
	public Pagination getDrugAuditResultList(StdProdDrugInfoForm form) {
		Pagination page = new Pagination(request);
		try {
			SysUser user = getUser();
			StdCompinfo compInfo = user.getInfo();
			if (compInfo != null) {
				String compId = compInfo.getCompId();
				if (StringUtils.isNotBlank(compId)) {
					form.setProdCompId(compId);
					page.setForm(form);
            		if(StringUtils.isNotBlank(user.getDefaultProjId())){
						form.setProjId(user.getDefaultProjId());
						page.getConditions().put("tag", Constants.DEFAULT_PROJ);
					}
					prodDrugManager.getDrugAuditResultList(page);
					page.setSuccess(true);
				}
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 跳转企业产品澄清页面
	 * @date 2015年8月31日
	 * @param model
	 * @param projId
	 * @return
	 */
	@RequestMapping("/toDrugComplainList")
	public String toDrugComplainList(Model model, String projId) {
		log.info("enter toDrugAuditResultList method!");
		model.addAttribute("projId", projId);
		return "/pro/project/prod/drugComplainList";
	}

	/**
	 * @category 查询企业产品澄清列表
	 * @date 2015年8月31日
	 * @param form
	 * @return
	 */
	@RequestMapping("/getDrugComplainList")
	@ResponseBody
	public Pagination getDrugComplainList(StdProdDrugInfoForm form) {
		Pagination page = new Pagination(request);
		try {
			SysUser user = getUser();
			StdCompinfo compInfo = user.getInfo();
			if (compInfo != null) {
				String compId = compInfo.getCompId();
				if (StringUtils.isNotBlank(compId)) {
					form.setProdCompId(compId);
					page.setForm(form);
					prodDrugManager.getDrugComplainList(page);
					if(StringUtils.isNotBlank(user.getDefaultProjId())){
						BidProjectDetails bidProjectDetails =prodProfileManager.getBidProjectDetailsById(user.getDefaultProjId());
						if(bidProjectDetails.getComplainEndtime ()!=null && bidProjectDetails.getComplainStarttime()!=null && bidProjectDetails.getComplainEndtime().getTime()>=new Date().getTime() ){
							page.setForm(Constants.DEFAULT_PROJ_1);//默认项目并且该项目在申报时间段内
						}else{
							page.setForm(Constants.DEFAULT_PROJ_2);//默认项目并且该项目不在申报时间段内
						}
					}else{
						page.setForm(Constants.DEFAULT_PROJ_3);//全部项目，为分离项目
					}
					page.setSuccess(true);
				}
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 跳转澄清编辑页面
	 * @date 2015年8月30日
	 * @param model
	 * @param projId
	 * @return
	 */
	@RequestMapping("/toDrugComplainListEdit")
	public String toDrugComplainListEdit(Model model, String prodId,
			String projId, String projProdDrugId) {
		Map<String, Object> detail = stdProdDrugInfoManager
				.getStdProdDrugInfoDetail(prodId);
		model.addAttribute("detail", detail);
		model.addAttribute("projId", projId);
		model.addAttribute("projProdDrugId", projProdDrugId);
		return "/pro/project/prod/drugComplainListEdit";
	}

	/**
	 * @category 企业产品澄清
	 * @date 2015年9月1日
	 * @param form
	 * @return
	 */
	@RequestMapping("/complainProdDrug")
	@ResponseBody
	public Pagination complainProdDrug(StdProdDrugInfoForm form) {
		Pagination page = new Pagination(request);
		try {
			if (form != null) {
				if (StringUtils.isNotBlank(form.getProdId())) {
					StdCompinfo compInfo = getUser().getInfo();
					if (compInfo != null) {
						String compId = compInfo.getCompId();
						if (StringUtils.isNotBlank(compId)) {
							form.setProdCompId(compId);
						}
					}
					prodDrugManager.complainProdDrug(form, getUser());
					page.setSuccess(true);
				}
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 跳转企业产品澄清结果列表
	 * @date 2015年8月31日
	 * @param model
	 * @param projId
	 * @return
	 */
	@RequestMapping("/toDrugComplainResultList")
	public String toDrugComplainResultList(Model model, String projId) {
		log.info("enter toDrugAuditResultList method!");
		model.addAttribute("projId", projId);
		return "/pro/project/prod/drugComplainResultList";
	}

	/**
	 * @category 查询企业产品澄清结果列表
	 * @date 2015年8月31日
	 * @param form
	 * @return
	 */
	@RequestMapping("/getDrugComplainResultList")
	@ResponseBody
	public Pagination getDrugComplainResultList(StdProdDrugInfoForm form) {
		Pagination page = new Pagination(request);
		try {
			SysUser user = getUser();
			StdCompinfo compInfo = user.getInfo();
			if (compInfo != null) {
				String compId = compInfo.getCompId();
				if (StringUtils.isNotBlank(compId)) {
					form.setProdCompId(compId);
					page.setForm(form);
		       		if(StringUtils.isNotBlank(user.getDefaultProjId())){
						form.setProjId(user.getDefaultProjId());
						page.getConditions().put("tag", Constants.DEFAULT_PROJ);
					}
					prodDrugManager.getDrugComplainResultList(page);
					page.setSuccess(true);
				}
			}
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 企业药品申报页面
	 * @date 2015年8月28日
	 * @return
	 */
	@RequestMapping("/toDrugProjectListDeclare")
	public String toDrugProjectListDeclare(Model model,RedirectAttributes attr) {
		log.info("enter toDrugProjectList method!");
		SysUser user = (SysUser)request.getSession().getAttribute(Constants.USERINFO);
		String defalutProjId=  user.getDefaultProjId();
		if ( StringUtils.isNotBlank(defalutProjId) ) {
			 attr.addAttribute("projId",defalutProjId);  
		     return "redirect:/prodDrug/toProdDrugList.html";
		}
		model.addAttribute("date", ParseDate.parseShortFormat(new Date()));
		return "/pro/project/prod/drugProjectListDeclare";
	}

	/**
	 * @category 查询项目列表
	 * @date 2015年9月6日
	 * @param form
	 * @return
	 */
	@RequestMapping("/getDrugProjectListDeclare")
	@ResponseBody
	public Pagination getDrugProjectListDeclare(ProdProjectForm form) {
		Pagination page = new Pagination(request);
		try {
			SysUser user = getUser();
			page.setForm(form);
			prodDrugManager.getDrugProjectListDeclare(page, user);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 企业药品审核查看
	 * @date 2015年8月28日
	 * @return
	 */
	@RequestMapping("/toDrugProjectListDeclareSee")
	public String toDrugProjectListDeclareSee(Model model,RedirectAttributes attr) {
		log.info("enter toDrugProjectList method!");
		model.addAttribute("date", ParseDate.parseShortFormat(new Date()));
		SysUser user = (SysUser)request.getSession().getAttribute(Constants.USERINFO);
		String defalutProjId=  user.getDefaultProjId();
		if ( StringUtils.isNotBlank(defalutProjId) ) {
			 attr.addAttribute("projId",defalutProjId);  
		     return "redirect:/prodDrug/toDrugAuditResultList.html";
		}
		return "/pro/project/prod/drugProjectListDeclareSee";
	}

	/**
	 * @category 查询项目列表
	 * @date 2015年9月6日
	 * @param form
	 * @return
	 */
	@RequestMapping("/getDrugProjectListDeclareSee")
	@ResponseBody
	public Pagination getDrugProjectListDeclareSee(ProdProjectForm form) {
		Pagination page = new Pagination(request);
		try {
			SysUser user = getUser();
			page.setForm(form);
			prodDrugManager.getDrugProjectListDeclareSee(page, user);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 企业药品审核澄清
	 * @date 2015年8月28日
	 * @return
	 */
	@RequestMapping("/toDrugProjectListClarify")
	public String toDrugProjectListClarify(Model model,RedirectAttributes attr) {
		log.info("enter toDrugProjectList method!");
		model.addAttribute("date", ParseDate.parseShortFormat(new Date()));
		SysUser user = (SysUser)request.getSession().getAttribute(Constants.USERINFO);
		String defalutProjId=  user.getDefaultProjId();
		if ( StringUtils.isNotBlank(defalutProjId) ) {
			 attr.addAttribute("projId",defalutProjId);  
		     return "redirect:/prodDrug/toDrugComplainList.html";
		}
		return "/pro/project/prod/drugProjectListClarify";
	}

	/**
	 * @category 查询项目列表
	 * @date 2015年9月6日
	 * @param form
	 * @return
	 */
	@RequestMapping("/getDrugProjectListClarify")
	@ResponseBody
	public Pagination getDrugProjectListClarify(ProdProjectForm form) {
		Pagination page = new Pagination(request);
		try {
			SysUser user = getUser();
			page.setForm(form);
			prodDrugManager.getDrugProjectListClarify(page, user);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * @category 企业药品审核澄清查看
	 * @date 2015年8月28日
	 * @return
	 */
	@RequestMapping("/toDrugProjectListClarifySee")
	public String toDrugProjectListClarifySee(RedirectAttributes attr) {
		log.info("enter toDrugProjectList method!");
		SysUser user = (SysUser)request.getSession().getAttribute(Constants.USERINFO);
		String defalutProjId=  user.getDefaultProjId();
		if ( StringUtils.isNotBlank(defalutProjId) ) {
			 attr.addAttribute("projId",defalutProjId);  
		     return "redirect:/prodDrug/toDrugComplainResultList.html";
		}
		
		return "/pro/project/prod/drugProjectListClarifySee";
	}

	/**
	 * @category 查询项目列表
	 * @date 2015年9月6日
	 * @param form
	 * @return
	 */
	@RequestMapping("/getDrugProjectListClarifySee")
	@ResponseBody
	public Pagination getDrugProjectListClarifySee(ProdProjectForm form) {
		Pagination page = new Pagination(request);
		try {
			SysUser user = getUser();
			page.setForm(form);
			prodDrugManager.getDrugProjectListClarifySee(page, user);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * 
	 * @category 通用名、英文、剂型、规格弹窗
	 * @author 言科
	 * @date 2015年8月19日 String
	 */
	@RequestMapping("/toDrugSelectQualityspec")
	public String toDrugSelectQualityspec(Model model, String projId) {
		log.info("enter toDrugAuditResultList method!");
		model.addAttribute("projId", projId);
		return "/pro/project/prod/drugSelectQualityspec";
	}

	@RequestMapping("/getDrugSelectQualityspec")
	@ResponseBody
	public Pagination getDrugSelectQualityspec(StdProdDrugInfoForm form) {
		Pagination page = new Pagination(request);
		try {
			page.setForm(form);
			prodDrugManager.getDrugSelectQualityspec(page);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * 
	 * @category 药理分类弹窗
	 * @author 言科
	 * @date 2015年8月19日 String
	 */
	@RequestMapping("/toDrugSelectPhar")
	public String toDrugSelectPhar(Model model, String phar) {
		log.info("enter toDrugAuditResultList method!");
		return "/pro/project/prod/drugSelectPhar";
	}

	@RequestMapping("/getDrugSelectPhar")
	@ResponseBody
	public Pagination getDrugSelectPhar(StdProdDrugInfoForm form) {
		Pagination page = new Pagination(request);
		try {
			page.setForm(form);
			stdProdDrugInfoManager.getSelectPhar(page);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * 
	 * @category 材质弹窗
	 * @author 言科
	 * @date 2015年8月19日 String
	 */
	@RequestMapping("/toDrugSelectMaterial")
	public String toDrugSelectMaterial(Model model, String phar) {
		log.info("enter toDrugAuditResultList method!");
		return "/pro/project/prod/drugSelectMaterial";
	}

	@RequestMapping("/getDrugSelectMaterial")
	@ResponseBody
	public Pagination getDrugSelectMaterial(StdProdDrugInfoForm form) {
		Pagination page = new Pagination(request);
		try {
			page.setForm(form);
			stdProdDrugInfoManager.getSelectMaterial(page);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

	/**
	 * 
	 * @category 包装单位弹窗
	 * @author 言科
	 * @date 2015年8月19日 String
	 */
	@RequestMapping("/toDrugSelectUnit")
	public String toDrugSelectUnit(Model model, String phar) {
		log.info("enter toDrugAuditResultList method!");
		return "/pro/project/prod/drugSelectUnit";
	}

	@RequestMapping("/getDrugSelectUnit")
	@ResponseBody
	public Pagination getDrugSelectUnit(StdProdDrugInfoForm form) {
		Pagination page = new Pagination(request);
		try {
			page.setForm(form);
			stdProdDrugInfoManager.getSelectUnit(page);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
			page.setSuccess(false);
		}
		return page;
	}

}
